# -*- coding: UTF-8 -*-
# 稳定匹配 多源-多卖家
import copy
from seller import Seller
from buyer import Buyer
from util import Util

# 参数
qseller = 5  # 卖家数量
qbuyer = 2  # 买家数量

# 初始化
k = 1  # 迭代次数
s = []  # 卖家集合
t = []  # 买家集合
util = Util()
pdata = util.initPlotData('match')  # 绘图数据
for i in range(qseller):
    seller = Seller(i, qbuyer)
    s.append(seller)
for i in range(qbuyer):
    buyer = Buyer(i)
    t.append(buyer)

# 迭代匹配
while (util.sthChanged(s)):
    # 清除买家收到的报价w
    for i in range(len(t)):
        t[i].w = []
    # 每个卖家先进行活动
    for i in range(len(s)):
        # 卖家寻找所有报价高于成本的买家
        s[i].findBuyerSet(t)
        # 向他们提供报价
        if (len(s[i].w) != 0):
            for ti in s[i].w:
                t[ti].w.append(i)

    # 每个买家从报价单中进行选择
    for i in range(len(t)):
        t[i].chooseSeller(s)

    # 每个卖家根据结果调整价格
    for i in range(len(s)):
        # 根据是否被拒绝调整价格
        oldprice = s[i].price.copy()  # 要用浅复制
        for ti in s[i].w:
            if (util.isRejected(i, t[ti])):
                s[i].adjustPrice(ti)
        # 如果价格变化，标志位置1
        if(oldprice == s[i].price):
            s[i].flag = False
        else:
            s[i].flag = True
        # 清空报价列表，以便紧接着更新
        s[i].w = []

    # 更新卖家的被接受列表
    for i in range(len(t)):
        if(len(t[i].w) != 0):
            for si in t[i].w:
                s[si].w.append(ti)

    # 显示当前状态，记录数据
    util.checkPoint(k, s, t, pdata)
    k += 1

util.doPlot(pdata)
